#include "xiot.h"
#include "util.h"

// 测试用 延时参数定义

/*debug printf*/
#define TAG_XIOT                        "XIOT"
#define DebugPrint_Xoit(fmt,...)        printWithTimestamp(TAG_XIOT,DEBUG_LEVEL_INFO, fmt, ##__VA_ARGS__) // 带时间戳
#define DebugPrint_Xoit_DEG(fmt,...)    printWithTimestamp(TAG_XIOT,DEBUG_LEVEL_DEBUG, fmt, ##__VA_ARGS__) // 带时间戳


/*
 * delayConfig初始化数组，包含4个延迟配置：
 *   - type: 配置类型
 *   - data: 延迟时间（毫秒）
 */
static DelayConfig delayConfig[4] = {
    {0, {1000}}, // 初始化type为0，data数组的第一个元素为1000
    {1, {2000}}, // 初始化type为1，data数组的第一个元素为2000
    {2, {3000}}, // 初始化type为2，data数组的第一个元素为3000
    {3, {4000}}  // 初始化type为3，data数组的第一个元素为4000
};

// XiotModule xiot;
// xiot事件
XiotEvent xiotEvent;
// xiot报告
static XiotReport xiotReport = {0};

// xiot内部处理事件队列
static QueueHandle_t xiotEventQueue = NULL;

void Xiot_EventLoopTask(void* arg);



/**
 * @brief 初始化Xiot模块。
 * 该函数负责初始化Xiot的硬件或软件环境，创建必要的任务和队列，以及初始化Xiot的报告机制。
 * 
 * @param 无
 * @return 无
 */
void Xiot_Init(void) {
    // 打印初始化开始的日志信息
    DebugPrint_Xiot("Xiot_Init\r\n");

    // 创建Xiot事件队列，用于任务间通信和事件处理
    xiotEventQueue = xQueueCreate(10, sizeof(XiotEvent));
    if (xiotEventQueue == NULL) {
        // 处理错误：队列创建失败。请添加具体的错误处理代码
    }

    // 创建Xiot事件循环任务，负责处理Xiot事件
    if (xTaskCreate(Xiot_EventLoopTask, "XiotEventLoop", 1024, NULL, 2, NULL) != pdTRUE) {
        // 处理错误：任务创建失败。请添加具体的错误处理代码
    }

    // 初始化Xiot的报告机制，用于向外报告Xiot的状态和事件
    // 初始化代码省略
}

// xiot反初始化
void Xiot_Deinit(void) {
    // 反初始化xiot硬件或软件
    // vQueueDelete(xXiotEventQueue);
    // 如果定时器还在运行，删除定时器
    // if (xiotTimer != NULL && xTimerStop(xiotTimer, 0) == pdFAIL) {
        // 处理错误：定时器停止失败
    // }
    // vTimerDelete(xiotTimer);
}

// xiot事件循环任务
void Xiot_EventLoopTask(void* arg) {
	XiotEvent event;
	uint32_t delay;
    while (1) {
        if (xQueueReceive(xiotEventQueue, &event, portMAX_DELAY) == pdTRUE) {
            // 根据事件类型调用用户回调接口
			DebugPrint_Xoit("receice event.type=%d\r\n", event.type);
            switch (event.type) {
				case XIOT_EVENT_INIT:
					xiotReport.xiotMsgType = XIOT_MSG_INIT_RESPONSE;
					xiotReport.xiotState = XIOT_STATE_INITIALIZED;
					break;
                case XIOT_EVENT_CONNECT:
                    // 连接事件处理
					xiotReport.xiotMsgType = XIOT_MSG_CONNECT;
					xiotReport.xiotState = XIOT_STATE_CONNECTED;
                    // 连接函数
                    
                    if(Xiot_Connect((XiotMessage_CONNECT *)event->message))
                    ;
                    break;
                case XIOT_EVENT_SEND:
                    // 发送事件处理
					xiotReport.xiotMsgType = XIOT_MSG_SEND_SUCCESS;
					delay = GetDelayDuration(1, delayConfig, sizeof(delayConfig) / sizeof(delayConfig[0]));
					vTaskDelay(delay);
					XiotEvent next_event;
					next_event.type = XIOT_EVENT_RECEIVE_TIMEOUT;
					xQueueSend(xiotEventQueue, &next_event, portMAX_DELAY);
                    break;
				case XIOT_EVENT_RECEIVE_TIMEOUT:
					// 接收超时事件处理
					delay = GetDelayDuration(2, delayConfig, sizeof(delayConfig) / sizeof(delayConfig[0]));
					vTaskDelay(delay);
					xiotReport.xiotMsgType = XIOT_MSG_RECEIVE_TIMEOUT;
					xiotReport.xiotState = XIOT_STATE_DISCONNECTED;
					break;
				default:
					break;
            }
			if(xiot.userEventHook != NULL){	
				xiot.userEventHook(&event, &xiotReport);
			}
        }
    }
}

// 获取xiot状态报告
XiotReport Xiot_GetReport(void) {
    return xiotReport;
}

/**
 * @brief 处理Xiot事件的函数。
 * 
 * 该函数根据传入的事件类型，构造一个XiotEvent结构体，并将其发送到指定的队列中。
 * 
 * @param eventType 事件的类型，用于定义事件的性质。
 * @param report 事件相关的报告，此处未使用，但保留以便于未来可能的扩展。
 */
void Xiot_Handle(XiotEventType *eventType) {
   
    // 构造XiotEvent结构体，初始化类型为传入的eventType
	XiotEvent event = {
		.type = eventType->type,
        .message = eventType->message
	};
    // 打印调试信息，显示当前处理的事件类型
	DebugPrint_Xiot(" handle event.type=%d\r\n", event.type);
    // 将构造的事件发送到事件队列，使用阻塞方式，等待时间为portMAX_DELAY
    xQueueSend(xiotEventQueue, &event, portMAX_DELAY);
}

// xiot模块实例化
XiotModule xiot = {
    .Init = Xiot_Init,
    .Deinit = Xiot_Deinit,
    // .EventLoopTask = Xiot_EventLoopTask,
    .GetReport = Xiot_GetReport,
    .Handle = Xiot_Handle,
	.userEventHook = NULL
};
// 其他辅助函数...